/**
 * 给定N个数，Ai表示2的Ai次方
 * 依次将Ai添加进序列，如果序列末尾的两个数相等就要相加合并，如此往复
 * 问序列中最后剩下几个数
 * 直接用栈模拟即可
 * 因为每个数最多添加一次、合并一次，因此是线性的。
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;
using vll = vector<llt>;

template<typename T>
void input(vector<T> & a, int n){
    a.assign(n + 1, {});
    for(int i=1;i<=n;++i) cin >> a[i];
    return;
}

template<typename T>
istream & operator >> (istream & is, vector<T> & v){
    for(auto & i : v) is >> i;
    return is;
}

int N;
vi A;

void work(){
    cin >> N;
    A.assign(N, {});
    cin >> A;
    vi ans;
    for(auto i : A){
        if(ans.empty()){
            ans.emplace_back(i);
        }else if(ans.back() != i){
            ans.emplace_back(i);
        }else{
            auto cur = i;
            while(1){
                ans.pop_back();
                cur += 1;
                if(ans.empty() or ans.back() != cur){
                    ans.emplace_back(cur);
                    break;
                }
            }
        }
    }
    cout << ans.size() << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}